package cli

import (
	"5title_gin/config"
	"5title_gin/global"
	"flag"
	"fmt"
	"os"
	"path/filepath"
)

type FlagOptions struct {
	File         string // 配置文件路径
	Version      bool   // 打印版本
	DB           bool   // 是否执行数据库迁移
	MigrateModel string // 需要迁移的模型名称（可选）
	Env          string // 运行环境
}

var Options FlagOptions

// findProjectRoot 查找项目根目录（通过寻找 go.mod 文件）
func findProjectRoot() (string, error) {
	dir, err := os.Getwd()
	if err != nil {
		return "", err
	}

	for {
		if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
			return dir, nil
		}
		parent := filepath.Dir(dir)
		if parent == dir {
			return "", fmt.Errorf("未找到项目根目录（go.mod 文件）")
		}
		dir = parent
	}
}

func GetConfigPath() string {
	// 查找项目根目录
	dir, err := findProjectRoot()
	if err != nil {
		panic(err)
	}

	// 默认走开发环境
	configFile := "settings.dev.yaml"
	if Options.Env == "prod" {
		configFile = "settings.prod.yaml"
	} else if Options.Env != "" && Options.Env != "dev" {
		configFile = fmt.Sprintf("settings.%s.yaml", Options.Env)
	}

	// 拼接 config 目录的路径
	return filepath.Join(dir, "config", configFile)
}

func Parse() {
	flag.StringVar(&Options.Env, "env", "", "environment (dev, prod, test, etc.)")
	flag.BoolVar(&Options.DB, "db", false, "迁移表结构（默认迁移所有模型）")
	flag.StringVar(&Options.MigrateModel, "model", "", "需要迁移的模型，逗号分隔 (e.g., user.UserModel)，为空则迁移所有模型")
	flag.BoolVar(&Options.Version, "v", false, "打印当前版本")
	flag.Parse()

	// 设置环境变量，让config.ReadConfig()也能识别环境
	if Options.Env != "" {
		os.Setenv("GO_ENV", Options.Env)
	}

	// 现在 Options.Env 已经有值了，可以安全调用 GetConfigPath
	defaultConfigPath := GetConfigPath()
	flag.StringVar(&Options.File, "f", defaultConfigPath, "配置文件路径")

	// 再次解析（如果有其他参数）
	flag.Parse()

	// 如果指定了配置文件，则使用指定的配置文件
	if Options.File != "" {
		global.Config = config.ReadConfigWithOptions(Options.File)
	}
}
func Run() {
	if Options.DB {
		MigrateDB()
		os.Exit(0)
	}
	if Options.Version {
		fmt.Println("当前版本：", global.Version)
		os.Exit(0)
	}
}
